package com.example.excelxssfexport.service;

import com.example.excelxssfexport.model.User;
import com.example.excelxssfexport.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 测试数据生成服务类
 * 
 * 用于生成指定数量的模拟用户数据并保存到数据库中
 */
@Service
public class DataGenerationService {
    
    /** 用户数据访问接口 */
    @Autowired
    private UserRepository userRepository;
    
    /** 姓氏数组，用于生成用户姓名 */
    private static final String[] FIRST_NAMES = {
        "张", "李", "王", "刘", "陈", "杨", "赵", "黄", "周", "吴",
        "徐", "孙", "胡", "朱", "高", "林", "何", "郭", "马", "罗"
    };
    
    /** 名字数组，用于生成用户姓名 */
    private static final String[] LAST_NAMES = {
        "伟", "芳", "娜", "敏", "静", "丽", "强", "磊", "军", "洋",
        "勇", "艳", "杰", "娟", "涛", "明", "超", "秀英", "霞", "平"
    };
    
    /** 邮箱域名数组，用于生成用户邮箱 */
    private static final String[] EMAIL_DOMAINS = {
        "gmail.com", "yahoo.com", "hotmail.com", "163.com", "qq.com", "sina.com", "sohu.com"
    };
    
    /**
     * 生成指定数量的用户数据并保存到数据库
     * 使用事务注解确保数据一致性
     * 批量保存避免内存溢出
     * 
     * @param count 需要生成的用户数量
     */
    @Transactional
    public void generateUsers(int count) {
        // 记录数据生成开始时间
        long startTime = System.currentTimeMillis();
        
        try {
            // 创建用户列表用于批量保存
            List<User> users = new ArrayList<>();
            // 随机数生成器，用于生成随机姓名、邮箱和年龄
            Random random = new Random();
            
            // 循环生成指定数量的用户数据
            for (int i = 1; i <= count; i++) {
                // 随机选择姓氏和名字组成全名
                String firstName = FIRST_NAMES[random.nextInt(FIRST_NAMES.length)];
                String lastName = LAST_NAMES[random.nextInt(LAST_NAMES.length)];
                String fullName = firstName + lastName;
                
                // 生成用户名（小写姓氏+名字+序号）
                String username = firstName.toLowerCase() + lastName.toLowerCase() + i;
                
                // 生成邮箱（用户名+随机域名）
                String email = username + "@" + EMAIL_DOMAINS[random.nextInt(EMAIL_DOMAINS.length)];
                
                // 生成年龄（18-67岁之间）
                int age = 18 + random.nextInt(50); // Age between 18 and 67
                
                // 创建用户对象并添加到列表
                User user = new User(username, email, fullName, age);
                users.add(user);
                
                // 每1000条数据保存一次，避免内存问题
                if (i % 1000 == 0) {
                    List<User> savedUsers = userRepository.saveAll(users);
                    // 验证保存结果
                    System.out.println("尝试保存 " + users.size() + " 条用户数据");
                    System.out.println("实际保存 " + savedUsers.size() + " 条用户数据");
                    // 清空列表准备下一批数据
                    users.clear();
                    System.out.println("已生成并保存 " + i + " 条用户数据");
                }
            }
            
            // 保存剩余未保存的用户数据
            if (!users.isEmpty()) {
                List<User> savedUsers = userRepository.saveAll(users);
                System.out.println("尝试保存最后 " + users.size() + " 条用户数据");
                System.out.println("实际保存最后 " + savedUsers.size() + " 条用户数据");
                users.clear();
            }
            
            // 记录数据生成结束时间并计算耗时
            long endTime = System.currentTimeMillis();
            long duration = endTime - startTime;
            
            long dbCount = userRepository.count();
            System.out.println("完成生成 " + count + " 条用户数据，数据库实际保存 " + dbCount + " 条用户数据");
            System.out.println("数据生成耗时: " + duration + " 毫秒");
        } catch (Exception e) {
            System.err.println("生成用户数据时发生错误: " + e.getMessage());
            e.printStackTrace();
            throw e;
        }
    }
}